package com.own.component.util.locate.util;

import com.own.component.util.locate.model.LocateModel;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * LocateDistanceUtil
 *
 * @author chenxueli
 * @date 2023-08-01 08:35:30
 */
public class LocateDistanceUtil {

    private static final BigDecimal BIG_DECIMAL_EARTH_RADIUS = new BigDecimal(6371000);

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    /**
     * 根据两个位置的经纬度，来计算两地的距离（m）
     *
     * @param locate1 位置1
     * @param locate2 位置2
     * @return 距离（m）
     */
    public static BigDecimal calc(LocateModel locate1, LocateModel locate2) {
        return calc(
                locate1.getLatitude(),
                locate1.getLongitude(),
                locate2.getLatitude(),
                locate2.getLongitude()
        );
    }

    /**
     * 根据两个位置的经纬度，来计算两地的距离（m）
     *
     * @param latitude1  纬度1
     * @param longitude1 经度1
     * @param latitude2  纬度2
     * @param longitude2 经度2
     * @return 距离（m）
     */
    public static BigDecimal calc(String latitude1, String longitude1, String latitude2, String longitude2) {
        return calc(
                Double.parseDouble(latitude1),
                Double.parseDouble(longitude1),
                Double.parseDouble(latitude2),
                Double.parseDouble(longitude2)
        );
    }

    /**
     * 根据两个位置的经纬度，来计算两地的距离（m）
     *
     * @param latitude1  纬度1
     * @param longitude1 经度1
     * @param latitude2  纬度2
     * @param longitude2 经度2
     * @return 距离（m）
     */
    public static BigDecimal calc(BigDecimal latitude1, BigDecimal longitude1, BigDecimal latitude2, BigDecimal longitude2) {
        return calc(
                latitude1.doubleValue(),
                longitude1.doubleValue(),
                latitude2.doubleValue(),
                longitude2.doubleValue()
        );
    }

    /**
     * 根据两个位置的经纬度，来计算两地的距离（m）
     *
     * @param latitude1  纬度1
     * @param longitude1 经度1
     * @param latitude2  纬度2
     * @param longitude2 经度2
     * @return 距离（m）
     */
    public static BigDecimal calc(Double latitude1, Double longitude1, Double latitude2, Double longitude2) {
        var radLat1 = rad(latitude1);
        var radLat2 = rad(latitude2);
        var a = radLat1 - radLat2;
        var b = rad(longitude1) - rad(longitude2);
        var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
        return new BigDecimal(s).multiply(BIG_DECIMAL_EARTH_RADIUS).setScale(2, RoundingMode.HALF_UP);
    }

}
